package reflection.class_;

import cat.Cat;

/**
 * @author DCSGO
 * @version 1.0
 * Class类
 */

/*
1.Class也是类,因此也继承Object类
2.Class类对象不是new出来的，而是系统创建的
3.对于某个类的Class类对象，在内存中只有一份，因为类只加载一次
4.每个类的实例都会记得自己是由哪个 Class 实例所生成
5.通过Class可以完整地得到一个类的完整结构,通过一系列API
6.Class对象是存放在堆的
7.类的字节码二进制数据，是放在方法区的，有的地方称为类的元数据
  (包括方法代码,变量名,方法名,访问权限等等)
 */

public class Class01 {
    public static void main(String[] args) throws ClassNotFoundException {
        //2.Class类对象不是new出来的，而是系统创建的
        //(1).普通方法实例化对象
        Cat cat = new Cat();
        /* 编译器会隐式的调用 ClassLoader 中的 loadClass 方法 生成该类的 Class 类对象并返回
        public Class<?> loadClass(String name) throws ClassNotFoundException {
            return loadClass(name, false);
        }
        */
        //(2).反射机制获得 Dog 类的 Class 类对象
        Class cls1 = Class.forName("dog.Dog");
        /* forName0 也会隐式的调用 ClassLoader 中的 loadClass 方法 生成该类的 Class 类对象并返回
        public static Class<?> forName(String className)
                throws ClassNotFoundException {
            Class<?> caller = Reflection.getCallerClass();
            return forName0(className, true, ClassLoader.getClassLoader(caller), caller);
        }
        */

        //3.对于某个类的Class类对象，在内存中只有一份，因为类只加载一次
        Class cls2 = Class.forName("dog.Dog");
        //现在我们再 debug 发现并没有再调用 loadClass

        System.out.println(cls1.hashCode());
        System.out.println(cls2.hashCode());
        //460141958
        //460141958
        //cls1 与 cls2 的 hashCode 相同也说明了这点
    }
}
